#include <myhead.h>
#include "controller.h"
#include "mynet.h"
#include "view.h"

//这是一个重要的变量
//收到强制下线报文时和执行退出登录操作时，需要将此变量置为0
//上线成功，置为1
int loginedFlag=0; //1-已经登录； 0-退出登录
char loginedName[20];
int heartTaskInterval=3;

void* heartKeepTask(void* arg){
	//该线程一旦启动，永不退出
	while(1){
		sleep(heartTaskInterval);
		if(loginedFlag == 0){
			continue;//未登录
		}
		if(strlen(loginedName)==0){
			continue;//可能因为某种错误，登录了，但是用户名没有记录，这也不行！
		}
		//组报心跳报文
		char sendBuf[28]={0};
		pkg_packHeart(sendBuf, loginedName);

		//发送心跳报文(心跳无返回报文)
		char errmsg[200];
		spkg_ret_t ret;
		int retno=mynet_send_locked(sendBuf,sizeof(sendBuf), &ret, 1,heartTaskInterval,errmsg);
		if(retno==0){
			if(ret.ret == -2){
				loginedFlag=0;
				memset(loginedName, 0 , sizeof(loginedName));
				//与界面无法解耦的系统
				printf("\n");//我就是要单独一行打印
				printSystemRed(ret.retmsg);
				//为了简单，直接结束进程
				//exit(EXIT_SUCCESS);
				kill(getpid(), SIGKILL);
			}
		}
	}
}

int userController_heartKeepTask_startup(int interval){
	memset(loginedName, 0 , sizeof(loginedName));
	loginedFlag=0;
	heartTaskInterval=interval;
	pthread_t tid;
	pthread_create(&tid, NULL, heartKeepTask , &interval);
	pthread_detach(tid);
}

const char* userController_getLoginUsername(){
	return loginedName;
}


/////////////////////////////////////////////////////////////////////////

int userController_login(char* username, char* passwd, char* errmsg){
	char sendBuf[48];
	pkg_packLogin(sendBuf, username, passwd);
	spkg_ret_t ret;
	if(mynet_send_locked(sendBuf,sizeof(sendBuf), &ret, 3,5,errmsg)==0){//通信成功，但不一定成功登录
		strcpy(errmsg, ret.retmsg);
		if(ret.ret == 0){//登录成功
			loginedFlag=1;
			strcpy(loginedName, username);
		}
		return ret.ret;
	}
	//通信失败，自然登录也是失败的
	return -1;
}

int userController_regist(char* username,char* passwd, char* passwd2, char* errmsg){
	if(strcmp(passwd, passwd2)!=0){
		strcpy(errmsg, "两次输入的密码不一致");
		return -1;
	}
	char sendBuf[48];
	pkg_packReg(sendBuf, username, passwd);
	//printf("con[%ld]: %s\n", sizeof(sendBuf), sendBuf);
	spkg_ret_t ret;
	if(mynet_send_locked(sendBuf,sizeof(sendBuf), &ret, 3, 5,errmsg)==0){
		strcpy(errmsg, ret.retmsg);
		return ret.ret;
	}
	return -1;
}


int userController_logout(char* errmsg){
	char sendBuf[28];
	pkg_packLogout(sendBuf, loginedName);
	spkg_ret_t ret;
	mynet_send_locked(sendBuf,sizeof(sendBuf), &ret, 3,5,errmsg);
	strcpy(errmsg, ret.retmsg);
	if(ret.ret == 0){//登出成功
		loginedFlag=0;
		memset(loginedName, 0, sizeof(loginedName));
	}
	return ret.ret;
}

